
//---- 函数
function playGame() {
    console.log('匹配队友');
    console.log('选英雄');
    console.log('骂队友');
    console.log('清兵线');
    console.log('抢野怪');
    console.log('骂队友');
    console.log('推塔');
    console.log('骂队友');
    console.log('defeat');
}
//调用函数
playGame()
playGame()


//函数的使用分为两步：声明函数 和 函数调用
// 函数三要素：名称、参数、返回值
//----- 声明函数
// 1.声明式函数
// function 函数名(){
//    函数体
// }

// 2.表达式
// let 函数名=function(){

// }

// 3.构造函数
// let 函数名称=new Function();

//注意：
// 1.function是全小写
// 2.函数名一般是动词
// 3.函数不调用就不执行
// 4.声明式的函数存在函数提升，可以在声明前调用

// console.log(num);
// var num = 10;

// foo()
// function foo(){
//     console.log('函数提升');
// }

//封装一个函数求1～100的数字之和
let sum = 0;
function getSum() {
    for (let i = 1; i <= 100; i++) {
        sum += i
    }

}
getSum()

let sum1 = 0;
function getSum1() {
    for (let i = 50; i <= 200; i++) {
        sum1 += i
    }

}

getSum1()
console.log(sum, sum1);


function getSum3(min = 1, max = 100) {
    let sum = 0;
    for (let i = min; i <= max; i++) {
        sum += i
    }
    console.log(sum);
}
//在函数声明的括号里写的是形式参数，简称形参，
//函数调用的时候传进去的是实际参数，简称实参
//函数可以有0到多个参数，形参实参是一一对应的
//默认参数 当函数被调用但没有传参时就会使用默认参数
getSum3(1, 100)
getSum3(100, 500);
getSum3()//1~100
getSum3(10)//10~100



function foo(name = 'zhangsan', age = 18, gender = 'male', hobby = '滑板er') {
    // console.log(arguments[2]);
    // for(let i=0;i<arguments.length;i++){
    //     console.log(arguments[i]);
    // }
    // arguments.push(100)
    //扩展运算符可以把伪数组转成真数组
    let arr = [...arguments];
    arr.push(22)
    console.log(arr);
    console.log(`我是${name},我今年${age}岁，${gender},${hobby}`);
}
// foo()//我是undefined,我今年undefined岁
foo('lisi', 20, 'female', '骂人')

//arguments 伪数组 
//有下标可以访问，但是不能调用数组的方法
//用来保存函数的实参


// let arr1=[1,2,3],arr2=[1,2,3];
// let arr3=[...arr1];

//练习找出任意个数的数字的最大值
function getMax() {
    let arr = [...arguments];
    arr.sort((a, b) => b - a);

    return [arr[0], arr.length]

}
// getMax(10, 3)
let max1 = getMax(10, 20, 12, 31, 7)
let max2 = getMax(0, 2, -12, -31, 17)
console.log(max1, max2);

//return 用于返回值，只能返回一个值
//return 后面的语句不再执行
//当需要返回多个值时通过数组返回
//函数没有return语句时会隐式返回undefined，写了return，没写具体返回什么值时，也是undefined
let arr = [1, 2, 3];
function foo([a, b, c]) {

    console.log(a, b, c);
}
foo(arr)//[a,b,c]=[1,2,3]

//---- 剩余参数（不定参数）rest（ES6） 真数组
//将剩余没有对应形参的参数放入rest数组中保存
function fn(a, b, c, ...rest) {
    // console.log(arguments);
    console.log(a, b, c);
    console.log(rest);
}

fn(1, 2, 3, 4, 5, 6, 7, 8, 9)



// 练习：1.封装函数求数组的最大、最小、平均值、和
function getValue(arr) {
    let max, min, avg, sum;
    arr.sort((a, b) => a - b);
    max = arr[arr.length - 1];
    min = arr[0];
    sum = arr.reduce((a, b) => a + b);
    avg = sum / arr.length;
    return [max, min, avg, sum]
}
let value = getValue([10, 20, 12, 31, 7])
console.log(`最大值：${value[0]},最小值：${value[1]},平均值:${value[2]},和是：${value[3]}`);

// 2.封装随机数函数
function createRandom(min=0,max=0) {
    // 当min和max传反时，交换
    if(min>max){
        [min,max]=[max,min];
    }
    let random = parseInt(Math.random() * (max - min + 1) + min)
    return random;
}
let num=createRandom(5);
console.log(num);
